/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.admin.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.modules.admin.dto.*;
import org.springblade.modules.admin.dto.feishu.ElevatorMaintainCostPlanListDTO;
import org.springblade.modules.admin.dto.feishu.FeiShuUserDeptElevatorWxPlanDTO;
import org.springblade.modules.admin.dto.feishu.UserPerformanceMonthPlanListDTO;
import org.springblade.modules.admin.dto.plan.*;
import org.springblade.modules.admin.dto.plan.score.PlanScoreSearchDTO;
import org.springblade.modules.admin.dto.rescue.TlwMalfunctionRescueDTO;
import org.springblade.modules.admin.dto.sugar.BiWxPlanListDTO;
import org.springblade.modules.admin.dto.sugar.ElevatorByCollectListDTO;
import org.springblade.modules.admin.dto.sugar.SugarSearchDTO;
import org.springblade.modules.admin.dto.tlw.TlwPlanQueryDTO;
import org.springblade.modules.admin.entity.MaintainMalfunctionRescue;
import org.springblade.modules.admin.entity.MaintainPlanContent;
import org.springblade.modules.admin.entity.MaintainPlanContentExt;
import org.springblade.modules.admin.vo.*;
import org.springblade.modules.admin.vo.feishu.LarkRepairVO;
import org.springblade.modules.admin.vo.image.by.ByPlanImageListVO;
import org.springblade.modules.admin.vo.openapi.SidaMaintainPlanVO;
import org.springblade.modules.admin.vo.plan.*;
import org.springblade.modules.admin.vo.plan.store.PlanScoreListVo;
import org.springblade.modules.admin.vo.plan.store.PlanScoreMonthVo;
import org.springblade.modules.admin.vo.sugar.ElevatorDetailScreenVO;
import org.springblade.modules.admin.vo.sugar.MaintainTypeDataVO;
import org.springblade.modules.admin.vo.sugar.MalfunctionScreenVO;
import org.springblade.modules.admin.vo.sugar.*;
import org.springblade.modules.admin.vo.sugar.bi.BILarkRescueCountSourceVO;
import org.springblade.modules.admin.vo.task.AddPlanVO;
import org.springblade.modules.admin.vo.task.MaintainPlanTableVO;
import org.springblade.modules.admin.vo.task.ModifyPlanVO;
import org.springblade.modules.admin.vo.task.SpeedPlanParam;
import org.springblade.modules.admin.vo.tlw.TlwByPlanVO;
import org.springblade.modules.system.entity.User;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * 维保任务表 服务类
 *
 * @author ysq
 * @since 2022-03-09
 */
public interface IMaintainPlanContentService extends BaseService<MaintainPlanContent> {

	/**
	 * 自定义分页
	 *
	 * @param page
	 * @param maintainPlanContent
	 * @return
	 */
	IPage<MaintainPlanContentVO> selectMaintainPlanContentPage(IPage<MaintainPlanContentVO> page, MaintainPlanContentVO maintainPlanContent);

	/**
	 * 删除指定时间区间所有未开始的任务
	 * @param elevatorIds
	 * @param startTime
	 * @param endTime
	 */
    void deleteDateIntervalTask(List<Long> elevatorIds, Date startTime, Date endTime);

	/**
	 * 根据任务id集合删除任务
	 * @param planIds
	 */
	void deleteTaskByPlanId(List<Long> planIds, List<Long> elevatorIds);

	/**
	 * 批量生成任务计划（一键排期）
	 * @param speedPlanParam
	 */
	void speedCreatePlanBatch(SpeedPlanParam speedPlanParam);

	/**
	 * 排期模板校验
	 * @param elevatorIds
	 * @param taskPlanId
	 */
	void taskTemplateCheck(String elevatorIds, Long taskPlanId);

	/**
	 * 电梯与模板年审类型校验
	 * @param elevatorIds
	 * @param taskPlanId
	 */
	void elevatorPlanUseTypeCheck(List<Long> elevatorIds, Long taskPlanId);

	/**
	 * 根据给定年份查保养计划
	 * @param elevatorIds
	 * @param year
	 * @param templateIds 高亮模板id
	 * @return
	 */
	TreeMap<String, List<MaintainPlanContentVO>> getMaintainPlans(List<Long> elevatorIds, Integer year, List<Long> templateIds);

	/**
	 * 修改自动排期
	 * @param modifyPlanVO
	 * @return
	 */
	boolean modifyPlan(ModifyPlanVO modifyPlanVO);

	/**
	 * 修改排期保养类型
	 * @param modifyPlanVO
	 * @return
	 */
	boolean modifyTemplate(ModifyPlanVO modifyPlanVO);

	/**
	 * 修改保养排期执行人
	 * @param modifyPlanUserDTO
	 * @return
	 */
	boolean modifyPlanUser(ModifyPlanUserDTO modifyPlanUserDTO);

	/**
	 * 批量设置计划执行人
	 * @param planUserDTO
	 * @return
	 */
	Integer batchModifyPlanUser(BatchModifyPlanUserDTO planUserDTO);

	/**
	 * 批量设置计划执行人(根据planId)
	 * @param planUserDTO
	 * @return
	 */
	Integer batchModifyPlanUserByPlanIds(BatchModifyPlanUserByPlanIdsDTO planUserDTO);

	/**
	 * 下载批量删除计划执行人错误数据
	 * @param response
	 */
	void downBatchDelUserErrExcel(HttpServletResponse response) throws IOException;

	/**
	 * 批量更好保养类型
	 * @param planUserDTO
	 * @return
	 */
	boolean BatchModifyPlanTemplate(BatchModifyPlanTemplateDTO planUserDTO);

	/**
	 * 增加排期
	 * @param addPlanVO
	 * @return
	 */
	boolean addPlan(AddPlanVO addPlanVO);

	/**
	 * 根据部门查询整体保养排期
	 * @param deptId
	 * @param yearMonth
	 * @return
	 */
	List<MaintainPlanTableVO> getDeptMaintainPlan(Long deptId, String yearMonth);



	/**
	 * 维保任务列表
	 * @version v2
	 * @param planSearchDTO 查询条件
	 * @return 数据集
	 */
	IPage<PlanResultVo> getV2Page(PlanSearchDTOV2 planSearchDTO);


	/**
	 *维修excel下载
	 * @param planSearchDTO
	 * @return
	 */
	List<PlanResultVo> getV2PageDownExcel(PlanSearchDTOV2 planSearchDTO);


	/**
	 * 获取作业明细详情
	 * @param planId：任务id
	 * @return 数据集
	 */
	MaintainPlanContentWorkDetailVo workDetail(Long planId);

	/**
	 * 获取维修记录详情
	 * @param planId
	 * @return
	 */
	MalRecordDetailVO getMalfunctionHistoryList(Long planId);

	Long savePlan(PlanContentSaveDto planContentSaveDto);

	/**
	 * 梯联网-维修报障新增
	 * @param tlwMalfunctionPlanSaveDTO
	 * @return
	 */
	boolean tlwMalPlanSave(TlwMalfunctionPlanSaveDTO tlwMalfunctionPlanSaveDTO);

	/**
	 * 梯联网-获取正在维修列表
	 * @param deviceId
	 * @return
	 */
	List<TlwMalfunctioningListVO> tlwMalfunctioningList(String deviceId);

	/**
	 * 梯联网-维修详情
	 * @param tlwJoinId
	 * @return
	 */
	TlwMalfunctionDetailVO tlwMalfunctionDetail(String tlwJoinId);


	/**
	 * 获取维修列表
	 * @param planSearchDTO 查询参数
	 * @return 数据集
	 */
	IPage<PlanListVo> malfunctionList(PlanSearchDTO planSearchDTO);

	LastPlanVO selectElevatorLastPlan(Long elevatorId, Long planId);

	List<LastPlanVO> selectElevatorLastPlans(List<Long> elevatorIds, List<Long> planIds);

	String getPlanTemplateName(Long planId);

	List<PlanTemplateDescVO> getPlanTemplateNames(List<Long> planIds);

	/**
	 * 根据工单id获取电梯位置信息
	 * @param planId
	 * @return
	 */
	ElevatorSimpleInfoVO getElevatorSimpleInfo(Long planId);

//    List<MaintainPlanContent> listPlanForCount(Integer typeStatus);

	List<MaintainPlanContent> listPlanForCount(Integer typeStatus, String startTime, String endTime);

	List<MaintainPlanContent> listWxPlanForCount(String typeStatus);

	/**
	 * 保养工单评分
	 * @param maintainPlanContentExt
	 * @return
	 */
	boolean byScoreSubmit(MaintainPlanContentExt maintainPlanContentExt);

	List<Map<String,String>> getSugarCheckPlanStatus(List<Long> deptIds);

	List<SugarCheckPlanHalfYearVO> getSugarCheckPlanHalfYear();

	List<SugarCheckPlanDeptRankingsVO> getSugarCheckPlanDeptRankings(PlanCheckStatisticsQueryDTO queryDTO);

	/**
	 * 大屏-报障维修-近30天报障维修情况
	 * @return
	 */
	MalfunctionScreenVO detailData(AnalysisStatisticalDTO param);

	/**
	 * 大屏-报障维修-近30天项目报障top5
	 * @return
	 * @param sortType
	 */
	List<MalfunctionScreenVO> repairProject(AnalysisStatisticalDTO param);

	/**
	 * 大屏-报障维修-近6个月故障趋势
	 * @return
	 */
	Map<String, MalfunctionScreenVO> repairTrend(AnalysisStatisticalDTO param);

	/**
	 * 近30天保养总览
	 * @return
	 */
	List<MaintainTypeDataVO> getSugarCheckPlanOneMonth();

	/**
	 * 大屏-电梯情况统计板块
	 * @return
	 */
	ElevatorDetailScreenVO getElevatorDetailScreen();

	/**
	 * 保养任务列表-数据看板
	 * @return
	 */
	ByPlanDataScreenVO byPlanDataScreen();

	/**
	 * 保养排期日历视图
	 * @param calendarScreenDTO
	 * @return
	 */
	List<MaintainCalendarScreenVO> maintainCalendarScreen(MaintainCalendarScreenDTO calendarScreenDTO);

	/**
	 * 获取所有工单数据,不区分租户，用来初始化数据
	 * @return 数据集
	 */
	List<MaintainPlanContent> getList();
	/**
	 * 检验当前任务是否存在日期调整记录
	 * @param planId
	 * @return
	 */
	boolean checkPlanDeferRecord(Long planId);

	Map<String,Object> selectPlanSimpleDetail(Long planId);


	/**
	 * 根据电梯id 获取最近保养工单的维保人员信息
	 * @param elevatorIds 电梯ids
	 * @return 数据集
	 */
	List<User> getUserListByElevatorIds(List<Long> elevatorIds);

    List<Map<String, Object>> estateSugarCheckPlanTop(String tenantId);

	List<MaintainPlanContent> estateSugarCheckPlanFinishStatus(String startDate, String endDate, List<Long> elevatorIds);

	/**
	 * 获取工单信息的其它额外信息，满足新需求
	 * @param planId 工单id
	 * @return 数据集
	 */
    PlanOtherInfoVo getPlanOtherInfo(Long planId);

	/**
	 * 根据用户id查询未来保养排期计划统计
	 * @param userId
	 * @return
	 */
	FutureMaintainPlanStatisticalVO futureMaintainPlanStatistical(Long userId);

	/**
	 * 离职人员-变更计划执行人
	 * @param moveUserPlanDTO
	 * @return
	 */
	boolean moveUserFuturePlan(MoveUserPlanDTO moveUserPlanDTO);

	/**
	 * 离职人员-移除计划执行人
	 * @param leaveUserId
	 * @return
	 */
	boolean delUserFuturePlan(Long leaveUserId);

	/**
	 * 根据用户userId查询审批统计（组长审批节点）
	 * @param userId
	 * @return
	 */
	PlanApproveVO partApproveStatistical(Long userId);
    /**
	 * 新增救援工单
	 * @param maintainMalfunctionRescue
	 * @return
	 */
	Long addRescuePlan(MaintainMalfunctionRescue maintainMalfunctionRescue);

	/**
	 * 梯联网-新增救援工单
	 * @param tlwMalfunctionRescue 梯联网DTO
	 * @return 工单id
	 */
	Long addTlwRescuePlan(TlwMalfunctionRescueDTO tlwMalfunctionRescue);

	/**
	 * 救援工单详情列表
	 * @param buildingId
	 * @param elevatorId
	 * @return
	 */
	List<RescueDetailVO> rescueDetailListByElevatorId(Long buildingId, Long elevatorId);


	/**
	 * 获取人员离职时关联责任梯，各类型工单统计
	 * @param userId
	 * @return
	 */
	UserDimissionCountVO selectUserDimissionCount(Long userId);


    Boolean deleteDimissionUserPlan(Long userId);

	List<Map<String,Object>> selectLeaveUserPlanStatus(MaintainLeaveUserPlanQuery planQuery);

	Boolean disposeSignatureTime();


	/**
	 * 获取工单初始化数据
	 * @return 数据集
	 */
    List<PlanInitVo> getPlanListInitData();

    List<TlwByPlanVO> tlwByPlanPage(TlwPlanQueryDTO queryDTO, IPage<TlwByPlanVO> page);

	List<TlwByPlanVO> tlwByPlanList(TlwPlanQueryDTO queryDTO);

	TlwByPlanVO tlwByPlanDetail(Long planId);

	/**
	 * 救援大屏个人详情工单统计
	 * @param userIds
	 * @return
	 */
	List<MaintainPlanContent> screenUserPlanStatisticsList(List<Long> userIds);

	/**
	 * 维修报障信息修改
	 * @param planContentUpdateDto 即将要修改的信息
	 * @return 是否成功
	 */
	boolean updateMessage(PlanContentUpdateDto planContentUpdateDto);

	/**
	 * 查询工单（忽略租户）
	 * @return
	 */
	MaintainPlanContent selectById(Long planId);

	/**
	 * 电梯工单任务状态
	 * @param deviceIds
	 * @return
	 */
    List<ElevatorTaskStatusVO> getElevatorTaskStatusList(List<String> deviceIds);

	/**
	 * 梯联网单体统计数据
	 * @param deviceId
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	List<MaintainPlanContentVO> getTlwElevatorStatistics(String deviceId, Date startDate, Date endDate);

	/**
	 * 新维修大屏 规定时间内 故障梯数
	 * @param beginTimeDate 开始时间
	 * @param endTimeDate 结束时间
	 * @param elevatorIds
	 * @return 数量
	 */
    Integer getRepairElevatorCount(Date beginTimeDate, Date endTimeDate, List<Long> elevatorIds);

	/**
	 * 新维修大屏 规定时间内 重复故障梯数
	 * @param beginTimeDate 开始时间
	 * @param endTimeDate 结束时间
	 * @param elevatorIds
	 * @return 数量
	 */
	Integer getVeryMuchProblemElevatorCount(Date beginTimeDate, Date endTimeDate, List<Long> elevatorIds);

	/**
	 * 故障电梯走势
	 * @param param
	 * @return
	 */
	Map<String, Long> elevatorTrend(AnalysisStatisticalDTO param);

	/**
	 * 维修报障来源
	 * @param beginTimeDate 开始时间
	 * @param endTimeDate 结束时间
	 * @return 结果vo列表
	 */
    List<NewRepairScreenSourceVO> getPlanSources(Date beginTimeDate, Date endTimeDate);

	/**
	 * 维修工单概况
	 * @param param
	 * @return
	 */
	MalPlanOverviewVO overview(AnalysisStatisticalDTO param);

	/**
	 * 工单执行情况
	 * @param param
	 * @return
	 */
	OrderDetailStatisticsVO orderDetailStatistics(AnalysisStatisticalDTO param);

	/**
	 * 故障现象
	 * @param param
	 * @return
	 */
	List<ChartVO> problemItemStatistics(AnalysisStatisticalDTO param);

	/**
	 * 2023-11-03 故障率与数据大屏同步
	 * @param beginTimeDate 开始时间
	 * @param endTimeDate 结束时间
	 * @return 与强哥一样的格式
	 */
	List<MaintainPlanContentVO> selectMalfunctionListInMonthPlus(Date beginTimeDate, Date endTimeDate);

	/**
	 * 2023-11-03 故障率与数据大屏同步
	 * @param beginTimeDate 开始时间
	 * @param endTimeDate 结束时间
	 * @return 与强哥一样的格式
	 */
	List<ElevatorEffectedVO> selectElevatorEffectedListInMonthPlus(Date beginTimeDate, Date endTimeDate);

	/**
	 * 批量关闭 事务工单
	 * @param newWorkPlanCloseDTO 事务工单id 集合
	 * @return 是否成功
	 */
    boolean closeBatch(NewWorkPlanCloseDTO newWorkPlanCloseDTO);

	/**
	 * 批量设置 事务工单时间
	 * @param newWorkPlanSetTimeDTO 事务工单 id 集合，目标批量数据
	 * @return 是否成功
	 */
	boolean setWorkPlanTimes(NewWorkPlanSetTimeDTO newWorkPlanSetTimeDTO);

	List<MaintainPlanContent> listWxPlan(Date beginTimeDate, Date endTimeDate);

    List<ByPlanImageListVO> selectByAllImage(String startDate, String endDate);

	IPage<PlanListVo> selectPlanOnlyDayList(PlanSearchDTO planSearchDTO);

	IPage<PlanListVo> planListNew(PlanSearchDTO planSearchDTO);


	/**
	 * 获取已经抽检的工单列表
	 * @param planScoreSearchDTO 查询条件
	 * @return 数据集
	 */
	IPage<PlanScoreListVo> getPlanScoreList(PlanScoreSearchDTO planScoreSearchDTO);


	/**
	 * 获取待抽检的工单列表
	 * @param planScoreSearchDTO 查询条件
	 * @return 数据集
	 */
	IPage<PlanScoreListVo> getDisPlanScoreList(PlanScoreSearchDTO planScoreSearchDTO);


	/**
	 * 获取待抽检的工单列表
	 * @param planScoreSearchDTO 查询条件
	 * @return 数据集
	 */
	List<Long> getDisPlanScoreAll(PlanScoreSearchDTO planScoreSearchDTO);


	/**
	 * 获取抽检工单的月份统计
	 * @param beginTime 开始时间
	 * @param endTime 结束时间
	 * @param typeStatus 工单类型
	 * @return
	 */
	List<PlanScoreMonthVo> getPlanScoreMonthList(Date beginTime, Date endTime, Integer typeStatus);


	/**
	 * excel下载工单列表
	 * @param planScoreSearchDTO 查询条件
	 * @return 数据集
	 */
	List<PlanScoreListVo> getPlanScoreListDownExcel(PlanScoreSearchDTO planScoreSearchDTO);

	/**
	 * 根据planId获取电梯信息
	 * @param planId
	 * @return
	 */
	ElevatorSimpleInfoVO selectPlanElevatorInfo(Long planId);

    Integer configTemplate(PlanTemplateSubmitDTO submitDTO);

	void downBatchDelTemplateErrExcel(HttpServletResponse response) throws IOException;


	/**
	 * 获取维修抽检评分
	 * @param planScoreSearchDTO 查询条件
	 * @return 数据集
	 */
	IPage<PlanScoreListVo> getPlanScoreListWx(PlanScoreSearchDTO planScoreSearchDTO);

	List<PlanSourceVO> getPlanSourceList(Long planId);

	/**
	 * 初始化维修报障来源
	 * @return 是否成功
	 */
    Boolean initPlanSourceList();

	/**
	 * Lark 工单逾期风险，复用分页逻辑，写死租户为592800
	 * @param planSearchDTO 查询条件
	 * @return 数据集
	 */
	List<PlanListVo> planListNewLark(PlanSearchDTO planSearchDTO);

	/**
	 * 维修工单列表
	 * @param planId 工单id
	 * @return 数据集
	 */
	List<LarkRepairVO> getLarkRepairVOListByPlanId(Long planId);

	/**
	 * 时间区间内 重复故障次数
	 * @param elevatorId 电梯id
	 * @param beginTime 开始时间
	 * @param endTime 结束时间
	 * @return 数量
	 */
	int troubleCount(Long elevatorId, Date beginTime, Date endTime);

    ElevatorStopPlanSimpleDTO selectElevatorStopPlanSimple(Long planId);

    List<PlanListVo> planListNewLarkTemp(PlanSearchDTO planSearchDTO);

	/**
	 * 根据planId获取电梯信息
	 * @param planId 工单id
	 * @return 数据集
	 */
	ElevatorRescueRobotSimpleVO getElevatorSimpleInfoByPlanId(Long planId);

	List<ElevatorEffectedVO> selectElevatorEffectedListByDate(Date beginTime,Date endTime);

	List<ElevatorEffectedVO> selectElevatorEffectedListByEndDate(String endTime);

	List<SidaMaintainPlanVO> getMaintainPlanListByTenantIdAndTime(String tenantId, Date startTime, Date endTime);

    List<UserPerformanceMonthPlanListDTO> listUserPerformancePlanList(String lastMonth, String tenantId);

    List<FeiShuUserDeptElevatorWxPlanDTO> selectUserDeptElevatorWxPlan(String lastMonth, List<Long> userIds);

    List<ElevatorMaintainCostPlanListDTO> selectElevatorMaintainCostPlanListMonth(String tenantId, String lastMonth, List<Long> elevatorIds);

    List<BILarkRescueCountSourceVO> getGalaxyRescueResource(Date startDate, Date endDate);

    List<BiWxPlanListDTO> selectBiWxPlanList(Date startDate, Date endDate);

    List<ElevatorSimpleInfoVO> selectElevatorStopByPlan(List<Long> planIds);

    List<BiWxPlanListDTO> selectBiWxPlanUserList(List<Long> planIds);

    List<BiWxPlanListDTO> selectElevatorDeptPlan(Date startDate, Date endDate);

	List<BiWxPlanListDTO> selectElevatorUserPlan(Date startDate, Date endDate);


	/**
	 * 维修待评分列表
	 * @param planScoreSearchDTO 查询条件
	 * @return 数据集
	 */
    IPage<PlanScoreListVo> getDisPlanScoreListWx(PlanScoreSearchDTO planScoreSearchDTO);

    List<ElevatorPlanUserDTO> selectCountByPlanUserSignature(String tenantId);

    List<ElevatorPlanUserDTO> selectCountUserByPlanOverdue(String tenantId);

    List<BiWxPlanListDTO> selectWxFaultPlanList(Date startDate, Date endDate);

	List<BiWxPlanListDTO> selectWxFaultPlanListAll(Date startDate, Date endDate);


	/**
	 * 根据电梯id获取工单
	 * @param eleId 电梯id
	 * @param beginTime 开始时间
	 * @param endTime 结束时间
	 * @return 工单列表
	 */
	List<MaintainPlanContent> getPlanListOfElevatorId(Long eleId,Date beginTime,Date endTime);

    String selectNextByDate(Long planId);

    List<VerifyModifyPlanUserResultVO> selectVerifyModifyPlanUser(BatchModifyPlanUserDTO userDTO);

	IPage<PlanListVo> planListNewDown(PlanSearchDTO planSearchDTO);

	/**
	 * 根据工单id集合获取所有计划及实际执行人信息
	 * @param planIds
	 * @return
	 */
	List<PlanUserAllDTO> selectPlanUserAll(List<Long> planIds);

	List<Long> selectElevatorByCollectPlanIds(SugarSearchDTO searchDTO);

    List<ElevatorByCollectListDTO> selectElevatorByCollectList(List<Long> planIds);

    List<ElevatorByCollectListDTO> selectElevatorByCollectCorrelationZgList(List<Long> planIds);

	List<ElevatorByCollectListDTO> selectElevatorByCollectCorrelationZgStatusList(SugarSearchDTO searchDTO);
}
